untrap-mcp 0.4.9 → 0.4.11
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/server.js +3 -3
- package/dist/tools/ai/explain-budget.js +2 -2
- package/dist/tools/ai/explain-sla.js +2 -2
- package/dist/tools/ai/explain-sla.js.map +1 -1
- package/dist/tools/analytics/tickets-over-budget.js +1 -1
- package/dist/tools/cfo/revenue-leakage.js +1 -1
- package/dist/tools/composite/technician-360.js +1 -1
- package/dist/tools/composite/ticket-deep-dive.js +5 -5
- package/dist/tools/composite/ticket-deep-dive.js.map +1 -1
- package/package.json +1 -1
package/dist/server.js
CHANGED
|
@@ -479,11 +479,11 @@ export function createServer(mspId, scopes = ["all"]) {
|
|
|
479
479
|
|
|
480
480
|
SCHEMA:
|
|
481
481
|
- ticket_lifecycle (tl): ticket_id, msp_id, company_name, summary, status, priority_name, owner_name, board_name, agreement_type, entered_date, responded_date, closed_date, resolution_minutes, response_minutes, is_closed, is_resolved, sla_status
|
|
482
|
-
- time_entries: ticket_id, msp_id,
|
|
482
|
+
- time_entries: ticket_id, msp_id, time_start, time_end, actual_hours, billable_hours, non_billable_hours, work_type, work_role, member_identifier, member_name, hourly_rate, total_cost, company, department, ticket_board
|
|
483
483
|
- companies: company_id, msp_id, company_name, status, use_client
|
|
484
484
|
- technicians: msp_id, technician_name, member_identifier, level, hourly_rate
|
|
485
|
-
- ticket_notes_sentiment: ticket_id, msp_id,
|
|
486
|
-
- ticket_ai_regen: ticket_id, msp_id,
|
|
485
|
+
- ticket_notes_sentiment: ticket_id, msp_id, sentiment_score, experience_score, note_count, resolution_minutes, response_minutes, priority_norm, created_at
|
|
486
|
+
- ticket_ai_regen: ticket_id, msp_id, problem_summary, ticket_categorization, root_cause_analysis, technician, client_name, created_at
|
|
487
487
|
- analytics.client_health_scores_mv: msp_id, company_name, health_score, status_color, risk_level, ticket_count, total_cost, period_start, period_end
|
|
488
488
|
- analytics.technician_dq_leaderboard_daily: msp_id, technician_name, quality_points, completeness_points, accuracy_points, timeliness_points, detail_quality_points, unique_tickets, calculation_date
|
|
489
489
|
- analytics.msp_pattern_analysis_rls: msp_id, pattern_name, ticket_count, affected_clients, root_cause_category
|
|
@@ -15,11 +15,11 @@ export async function explainBudgetOverage(mspId, params) {
|
|
|
15
15
|
tl.resolution_minutes
|
|
16
16
|
FROM ticket_lifecycle tl
|
|
17
17
|
WHERE tl.msp_id = $1 AND tl.ticket_id = $2 ${tf}`, [mspId, params.ticketId], mspId),
|
|
18
|
-
queryRLS(`SELECT
|
|
18
|
+
queryRLS(`SELECT ticket_budget_hours, actual_hours, hours_over_budget, percent_over_budget,
|
|
19
19
|
member_name
|
|
20
20
|
FROM analytics.technician_ticket_budget_mv
|
|
21
21
|
WHERE msp_id = $1 AND ticket_id = $2 AND member_identifier = $3`, [mspId, params.ticketId, params.memberIdentifier], mspId),
|
|
22
|
-
queryRLS(`SELECT
|
|
22
|
+
queryRLS(`SELECT sentiment_score, experience_score, note_count, created_at::text
|
|
23
23
|
FROM ticket_notes_sentiment
|
|
24
24
|
WHERE msp_id = $1 AND ticket_id = $2
|
|
25
25
|
ORDER BY created_at ASC
|
|
@@ -9,10 +9,10 @@ export async function explainSlaVariance(mspId, params) {
|
|
|
9
9
|
tl.sla_status, tl.entered_date::text, tl.responded_date::text, tl.closed_date::text
|
|
10
10
|
FROM ticket_lifecycle tl
|
|
11
11
|
WHERE tl.msp_id = $1 AND tl.ticket_id = $2 ${tf}`, [mspId, params.ticketId], mspId),
|
|
12
|
-
queryRLS(`SELECT member_name, actual_hours,
|
|
12
|
+
queryRLS(`SELECT member_name, actual_hours, time_start::text, work_type
|
|
13
13
|
FROM time_entries
|
|
14
14
|
WHERE msp_id = $1 AND ticket_id = $2
|
|
15
|
-
ORDER BY
|
|
15
|
+
ORDER BY time_start ASC`, [mspId, params.ticketId], mspId),
|
|
16
16
|
]);
|
|
17
17
|
if (ticket.length === 0) {
|
|
18
18
|
return { ticket: null, time_entries: [] };
|
|
@@ -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,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
|
|
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,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;;;+BAGyB,EACzB,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,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IAC5C,CAAC;IAED,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACjB,YAAY,EAAE,WAAW;KAC1B,CAAC;AACJ,CAAC"}
|
|
@@ -19,7 +19,7 @@ export async function getTicketsOverBudget(mspId, params) {
|
|
|
19
19
|
const result = await Promise.all(techSummary.map(async (tech) => {
|
|
20
20
|
const tickets = await queryRLS(`SELECT ticket_id, summary, company_name, created_date::text,
|
|
21
21
|
board_name, status,
|
|
22
|
-
|
|
22
|
+
ticket_budget_hours,
|
|
23
23
|
actual_hours, hours_over_budget,
|
|
24
24
|
ROUND(percent_over_budget::numeric, 0)::int as percent_over_budget
|
|
25
25
|
FROM analytics.technician_ticket_budget_mv
|
|
@@ -8,7 +8,7 @@ export async function cfoRevenuLeakage(mspId, params) {
|
|
|
8
8
|
let outOfScope = [];
|
|
9
9
|
try {
|
|
10
10
|
outOfScope = await queryRLS(`SELECT bc.ticket_id, bc.company_name, bc.ticket_summary, bc.billable_amount,
|
|
11
|
-
bc.
|
|
11
|
+
bc.agreement_type, bc.resolved_date::text,
|
|
12
12
|
bc.reasoning
|
|
13
13
|
FROM agents.billing_classifications bc
|
|
14
14
|
WHERE bc.msp_id::uuid = $1::uuid
|
|
@@ -31,7 +31,7 @@ export async function getTechnician360(mspId, params) {
|
|
|
31
31
|
// Budget overages
|
|
32
32
|
queryRLS(`SELECT COUNT(*)::int as over_budget_tickets,
|
|
33
33
|
SUM(hours_over_budget)::numeric as total_hours_over,
|
|
34
|
-
AVG(
|
|
34
|
+
AVG(percent_over_budget)::numeric as avg_pct_over
|
|
35
35
|
FROM analytics.technician_ticket_budget_mv
|
|
36
36
|
WHERE msp_id = $1 AND LOWER(member_name) = LOWER($2)
|
|
37
37
|
AND hours_over_budget > 0`, [mspId, params.technicianName], mspId),
|
|
@@ -14,25 +14,25 @@ export async function getTicketDeepDive(mspId, params) {
|
|
|
14
14
|
FROM ticket_lifecycle tl
|
|
15
15
|
WHERE tl.msp_id = $1 AND tl.ticket_id = $2 ${tf}`, [mspId, params.ticketId], mspId),
|
|
16
16
|
// AI analysis
|
|
17
|
-
queryRLS(`SELECT problem_statement as problem_summary, ai_summary,
|
|
18
|
-
ticket_classification,
|
|
17
|
+
queryRLS(`SELECT problem_statement as problem_summary, problem_summary as ai_summary,
|
|
18
|
+
ticket_categorization as ticket_classification, root_cause_analysis,
|
|
19
19
|
ticket_categorization
|
|
20
20
|
FROM ticket_ai_regen
|
|
21
21
|
WHERE msp_id = $1 AND ticket_id = $2`, [mspId, params.ticketId], mspId),
|
|
22
22
|
// Time entries
|
|
23
23
|
queryRLS(`SELECT member_name as technician, actual_hours, billable_hours,
|
|
24
24
|
hourly_rate, (actual_hours * COALESCE(hourly_rate, 0))::numeric as cost,
|
|
25
|
-
|
|
25
|
+
work_type
|
|
26
26
|
FROM time_entries te
|
|
27
27
|
WHERE te.msp_id = $1 AND te.ticket_id = $2 ${tef}
|
|
28
|
-
ORDER BY te.
|
|
28
|
+
ORDER BY te.time_start DESC`, [mspId, params.ticketId], mspId),
|
|
29
29
|
// Sentiment
|
|
30
30
|
queryRLS(`SELECT AVG(sentiment_score)::numeric as avg_sentiment,
|
|
31
31
|
COUNT(*)::int as note_count
|
|
32
32
|
FROM ticket_notes_sentiment
|
|
33
33
|
WHERE msp_id = $1 AND ticket_id = $2`, [mspId, params.ticketId], mspId),
|
|
34
34
|
// Budget status
|
|
35
|
-
queryRLS(`SELECT
|
|
35
|
+
queryRLS(`SELECT ticket_budget_hours, actual_hours, hours_over_budget, percent_over_budget
|
|
36
36
|
FROM analytics.technician_ticket_budget_mv
|
|
37
37
|
WHERE msp_id = $1 AND ticket_id = $2
|
|
38
38
|
LIMIT 1`, [mspId, params.ticketId], mspId),
|
|
@@ -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,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;
|
|
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;qCACpB,EAC7B,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"}
|