@cliwant/practiq-mcp 0.1.0
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/LICENSE +661 -0
- package/README.md +238 -0
- package/dist/bin/practiq-mcp.d.ts +11 -0
- package/dist/bin/practiq-mcp.d.ts.map +1 -0
- package/dist/bin/practiq-mcp.js +59 -0
- package/dist/bin/practiq-mcp.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +348 -0
- package/dist/server.js.map +1 -0
- package/dist/store/client-store.d.ts +29 -0
- package/dist/store/client-store.d.ts.map +1 -0
- package/dist/store/client-store.js +146 -0
- package/dist/store/client-store.js.map +1 -0
- package/dist/store/deadline-store.d.ts +22 -0
- package/dist/store/deadline-store.d.ts.map +1 -0
- package/dist/store/deadline-store.js +92 -0
- package/dist/store/deadline-store.js.map +1 -0
- package/dist/store/interaction-store.d.ts +22 -0
- package/dist/store/interaction-store.d.ts.map +1 -0
- package/dist/store/interaction-store.js +111 -0
- package/dist/store/interaction-store.js.map +1 -0
- package/dist/store/types.d.ts +83 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +8 -0
- package/dist/store/types.js.map +1 -0
- package/dist/tools/add-client.d.ts +24 -0
- package/dist/tools/add-client.d.ts.map +1 -0
- package/dist/tools/add-client.js +88 -0
- package/dist/tools/add-client.js.map +1 -0
- package/dist/tools/client-context.d.ts +8 -0
- package/dist/tools/client-context.d.ts.map +1 -0
- package/dist/tools/client-context.js +104 -0
- package/dist/tools/client-context.js.map +1 -0
- package/dist/tools/client-health.d.ts +8 -0
- package/dist/tools/client-health.d.ts.map +1 -0
- package/dist/tools/client-health.js +104 -0
- package/dist/tools/client-health.js.map +1 -0
- package/dist/tools/deadline-tracker.d.ts +13 -0
- package/dist/tools/deadline-tracker.d.ts.map +1 -0
- package/dist/tools/deadline-tracker.js +145 -0
- package/dist/tools/deadline-tracker.js.map +1 -0
- package/dist/tools/handoff-brief.d.ts +10 -0
- package/dist/tools/handoff-brief.d.ts.map +1 -0
- package/dist/tools/handoff-brief.js +116 -0
- package/dist/tools/handoff-brief.js.map +1 -0
- package/dist/tools/log-interaction.d.ts +12 -0
- package/dist/tools/log-interaction.d.ts.map +1 -0
- package/dist/tools/log-interaction.js +48 -0
- package/dist/tools/log-interaction.js.map +1 -0
- package/dist/tools/morning-briefing.d.ts +8 -0
- package/dist/tools/morning-briefing.d.ts.map +1 -0
- package/dist/tools/morning-briefing.js +103 -0
- package/dist/tools/morning-briefing.js.map +1 -0
- package/dist/tools/prepare-meeting.d.ts +9 -0
- package/dist/tools/prepare-meeting.d.ts.map +1 -0
- package/dist/tools/prepare-meeting.js +121 -0
- package/dist/tools/prepare-meeting.js.map +1 -0
- package/dist/tools/search-clients.d.ts +8 -0
- package/dist/tools/search-clients.d.ts.map +1 -0
- package/dist/tools/search-clients.js +45 -0
- package/dist/tools/search-clients.js.map +1 -0
- package/dist/tools/week-priorities.d.ts +5 -0
- package/dist/tools/week-priorities.d.ts.map +1 -0
- package/dist/tools/week-priorities.js +98 -0
- package/dist/tools/week-priorities.js.map +1 -0
- package/dist/utils/date-utils.d.ts +18 -0
- package/dist/utils/date-utils.d.ts.map +1 -0
- package/dist/utils/date-utils.js +75 -0
- package/dist/utils/date-utils.js.map +1 -0
- package/dist/utils/scoring.d.ts +18 -0
- package/dist/utils/scoring.d.ts.map +1 -0
- package/dist/utils/scoring.js +155 -0
- package/dist/utils/scoring.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepare-meeting.d.ts","sourceRoot":"","sources":["../../src/tools/prepare-meeting.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CA0HhF"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* prepare_meeting — Pre-meeting context bundle for a client.
|
|
3
|
+
*/
|
|
4
|
+
import { getClient } from "../store/client-store.js";
|
|
5
|
+
import { getInteractions } from "../store/interaction-store.js";
|
|
6
|
+
import { getDeadlinesForClient } from "../store/deadline-store.js";
|
|
7
|
+
import { formatDueRelative } from "../utils/date-utils.js";
|
|
8
|
+
export async function prepareMeeting(input) {
|
|
9
|
+
const client = await getClient(input.client_name);
|
|
10
|
+
if (!client) {
|
|
11
|
+
return `Client not found: "${input.client_name}". Use search_clients to find the correct name.`;
|
|
12
|
+
}
|
|
13
|
+
const interactions = await getInteractions(client.slug);
|
|
14
|
+
const deadlines = await getDeadlinesForClient(client.slug);
|
|
15
|
+
const activeDeadlines = deadlines.filter((d) => !d.completed);
|
|
16
|
+
const sections = [];
|
|
17
|
+
sections.push(`MEETING PREP: ${client.name}`);
|
|
18
|
+
sections.push("=".repeat(50));
|
|
19
|
+
if (input.meeting_purpose) {
|
|
20
|
+
sections.push(`Purpose: ${input.meeting_purpose}`);
|
|
21
|
+
}
|
|
22
|
+
sections.push("");
|
|
23
|
+
// Client snapshot
|
|
24
|
+
sections.push("CLIENT SNAPSHOT:");
|
|
25
|
+
sections.push(` Vertical: ${client.vertical}`);
|
|
26
|
+
sections.push(` Status: ${client.status}`);
|
|
27
|
+
sections.push(` Engagement: ${client.engagement.type} since ${client.engagement.startDate}`);
|
|
28
|
+
if (client.engagement.value) {
|
|
29
|
+
sections.push(` Monthly value: $${client.engagement.value.toLocaleString()}`);
|
|
30
|
+
}
|
|
31
|
+
if (client.engagement.scope) {
|
|
32
|
+
sections.push(` Scope: ${client.engagement.scope}`);
|
|
33
|
+
}
|
|
34
|
+
sections.push("");
|
|
35
|
+
// Key contacts
|
|
36
|
+
if (client.contacts.length > 0) {
|
|
37
|
+
sections.push("KEY CONTACTS:");
|
|
38
|
+
for (const c of client.contacts) {
|
|
39
|
+
const primary = c.isPrimary ? " [PRIMARY]" : "";
|
|
40
|
+
sections.push(` - ${c.name}, ${c.role}${primary}`);
|
|
41
|
+
if (c.email)
|
|
42
|
+
sections.push(` ${c.email}`);
|
|
43
|
+
if (c.notes)
|
|
44
|
+
sections.push(` Note: ${c.notes}`);
|
|
45
|
+
}
|
|
46
|
+
sections.push("");
|
|
47
|
+
}
|
|
48
|
+
// Recent interactions (last 5)
|
|
49
|
+
if (interactions.length > 0) {
|
|
50
|
+
sections.push("RECENT INTERACTIONS:");
|
|
51
|
+
for (const i of interactions.slice(0, 5)) {
|
|
52
|
+
sections.push(` [${i.date}] ${i.type.toUpperCase()}: ${i.summary}`);
|
|
53
|
+
if (i.actionItems.length > 0) {
|
|
54
|
+
sections.push(" Open items:");
|
|
55
|
+
for (const item of i.actionItems) {
|
|
56
|
+
sections.push(` - ${item}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
sections.push("");
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
sections.push("RECENT INTERACTIONS: None recorded");
|
|
64
|
+
sections.push("");
|
|
65
|
+
}
|
|
66
|
+
// Open action items from all interactions
|
|
67
|
+
const allActionItems = [];
|
|
68
|
+
for (const i of interactions) {
|
|
69
|
+
for (const item of i.actionItems) {
|
|
70
|
+
allActionItems.push({ date: i.date, item });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (allActionItems.length > 0) {
|
|
74
|
+
sections.push("OPEN ACTION ITEMS (from previous interactions):");
|
|
75
|
+
for (const a of allActionItems.slice(0, 10)) {
|
|
76
|
+
sections.push(` - [${a.date}] ${a.item}`);
|
|
77
|
+
}
|
|
78
|
+
sections.push("");
|
|
79
|
+
}
|
|
80
|
+
// Active deadlines
|
|
81
|
+
if (activeDeadlines.length > 0) {
|
|
82
|
+
sections.push("ACTIVE DEADLINES:");
|
|
83
|
+
for (const d of activeDeadlines) {
|
|
84
|
+
const status = new Date(d.dueDate).getTime() < Date.now()
|
|
85
|
+
? "OVERDUE"
|
|
86
|
+
: formatDueRelative(d.dueDate);
|
|
87
|
+
sections.push(` - [${d.priority.toUpperCase()}] ${d.description} — ${status}`);
|
|
88
|
+
}
|
|
89
|
+
sections.push("");
|
|
90
|
+
}
|
|
91
|
+
// Notes
|
|
92
|
+
if (client.notes) {
|
|
93
|
+
sections.push("CLIENT NOTES:");
|
|
94
|
+
sections.push(client.notes);
|
|
95
|
+
sections.push("");
|
|
96
|
+
}
|
|
97
|
+
// Suggested talking points
|
|
98
|
+
sections.push("SUGGESTED TALKING POINTS:");
|
|
99
|
+
const talkingPoints = [];
|
|
100
|
+
if (activeDeadlines.some((d) => new Date(d.dueDate).getTime() < Date.now())) {
|
|
101
|
+
talkingPoints.push("Review overdue deadlines and establish new timelines");
|
|
102
|
+
}
|
|
103
|
+
if (activeDeadlines.length > 0) {
|
|
104
|
+
talkingPoints.push("Status update on upcoming deadlines");
|
|
105
|
+
}
|
|
106
|
+
if (allActionItems.length > 0) {
|
|
107
|
+
talkingPoints.push("Follow up on outstanding action items");
|
|
108
|
+
}
|
|
109
|
+
if (input.meeting_purpose) {
|
|
110
|
+
talkingPoints.push(`Discuss: ${input.meeting_purpose}`);
|
|
111
|
+
}
|
|
112
|
+
if (!client.lastInteraction || (Date.now() - new Date(client.lastInteraction).getTime()) > 30 * 24 * 60 * 60 * 1000) {
|
|
113
|
+
talkingPoints.push("General check-in — it has been a while since last contact");
|
|
114
|
+
}
|
|
115
|
+
talkingPoints.push("Confirm next steps and follow-up date");
|
|
116
|
+
for (const tp of talkingPoints) {
|
|
117
|
+
sections.push(` - ${tp}`);
|
|
118
|
+
}
|
|
119
|
+
return sections.join("\n");
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=prepare-meeting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepare-meeting.js","sourceRoot":"","sources":["../../src/tools/prepare-meeting.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* search_clients — Full-text search across all client data.
|
|
3
|
+
*/
|
|
4
|
+
export interface SearchClientsInput {
|
|
5
|
+
query: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function searchClientsTool(input: SearchClientsInput): Promise<string>;
|
|
8
|
+
//# sourceMappingURL=search-clients.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-clients.d.ts","sourceRoot":"","sources":["../../src/tools/search-clients.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiDlF"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* search_clients — Full-text search across all client data.
|
|
3
|
+
*/
|
|
4
|
+
import { searchClients } from "../store/client-store.js";
|
|
5
|
+
import { searchInteractions } from "../store/interaction-store.js";
|
|
6
|
+
export async function searchClientsTool(input) {
|
|
7
|
+
if (!input.query || input.query.trim().length === 0) {
|
|
8
|
+
return "Please provide a search query.";
|
|
9
|
+
}
|
|
10
|
+
const clientResults = await searchClients(input.query);
|
|
11
|
+
const interactionResults = await searchInteractions(input.query);
|
|
12
|
+
if (clientResults.length === 0 && interactionResults.length === 0) {
|
|
13
|
+
return `No results found for "${input.query}".`;
|
|
14
|
+
}
|
|
15
|
+
const sections = [];
|
|
16
|
+
sections.push(`SEARCH RESULTS FOR: "${input.query}"`);
|
|
17
|
+
sections.push("=".repeat(50));
|
|
18
|
+
sections.push("");
|
|
19
|
+
if (clientResults.length > 0) {
|
|
20
|
+
sections.push(`CLIENT MATCHES (${clientResults.length}):`);
|
|
21
|
+
for (const r of clientResults.slice(0, 15)) {
|
|
22
|
+
sections.push(` ${r.client.name} (${r.client.vertical}, ${r.client.status})`);
|
|
23
|
+
sections.push(` Match: ${r.matchContext}`);
|
|
24
|
+
}
|
|
25
|
+
if (clientResults.length > 15) {
|
|
26
|
+
sections.push(` ... and ${clientResults.length - 15} more`);
|
|
27
|
+
}
|
|
28
|
+
sections.push("");
|
|
29
|
+
}
|
|
30
|
+
if (interactionResults.length > 0) {
|
|
31
|
+
sections.push(`INTERACTION MATCHES (${interactionResults.length}):`);
|
|
32
|
+
for (const r of interactionResults.slice(0, 15)) {
|
|
33
|
+
sections.push(` [${r.interaction.date}] ${r.interaction.clientSlug} — ${r.interaction.type}`);
|
|
34
|
+
sections.push(` Match: ${r.matchContext}`);
|
|
35
|
+
}
|
|
36
|
+
if (interactionResults.length > 15) {
|
|
37
|
+
sections.push(` ... and ${interactionResults.length - 15} more`);
|
|
38
|
+
}
|
|
39
|
+
sections.push("");
|
|
40
|
+
}
|
|
41
|
+
sections.push(`Total: ${clientResults.length} client${clientResults.length !== 1 ? "s" : ""}, ` +
|
|
42
|
+
`${interactionResults.length} interaction${interactionResults.length !== 1 ? "s" : ""}`);
|
|
43
|
+
return sections.join("\n");
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=search-clients.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-clients.js","sourceRoot":"","sources":["../../src/tools/search-clients.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"week-priorities.d.ts","sourceRoot":"","sources":["../../src/tools/week-priorities.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAuHtD"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* week_priorities — Prioritized client list for the week.
|
|
3
|
+
*/
|
|
4
|
+
import { getAllClients } from "../store/client-store.js";
|
|
5
|
+
import { getAllInteractions } from "../store/interaction-store.js";
|
|
6
|
+
import { getAllDeadlines, getActiveDeadlines } from "../store/deadline-store.js";
|
|
7
|
+
import { computeHealth } from "../utils/scoring.js";
|
|
8
|
+
import { startOfWeek, endOfWeek, daysUntil, daysSince, formatRelative, } from "../utils/date-utils.js";
|
|
9
|
+
export async function weekPriorities() {
|
|
10
|
+
const clients = await getAllClients();
|
|
11
|
+
if (clients.length === 0) {
|
|
12
|
+
return "No clients found. Use the add_client tool to add your first client.";
|
|
13
|
+
}
|
|
14
|
+
const allInteractions = await getAllInteractions();
|
|
15
|
+
const allDeadlines = await getAllDeadlines();
|
|
16
|
+
const activeDeadlines = await getActiveDeadlines();
|
|
17
|
+
const priorities = [];
|
|
18
|
+
for (const client of clients) {
|
|
19
|
+
if (client.status === "churned")
|
|
20
|
+
continue;
|
|
21
|
+
const cInteractions = allInteractions.filter((i) => i.clientSlug === client.slug);
|
|
22
|
+
const cDeadlines = allDeadlines.filter((d) => d.clientSlug === client.slug);
|
|
23
|
+
const cActiveDeadlines = activeDeadlines.filter((d) => d.clientSlug === client.slug);
|
|
24
|
+
const health = computeHealth(client, cInteractions, cDeadlines);
|
|
25
|
+
let score = 0;
|
|
26
|
+
const reasons = [];
|
|
27
|
+
// Overdue deadlines (highest priority)
|
|
28
|
+
const overdueCount = cActiveDeadlines.filter((d) => new Date(d.dueDate).getTime() < Date.now()).length;
|
|
29
|
+
if (overdueCount > 0) {
|
|
30
|
+
score += 40;
|
|
31
|
+
reasons.push(`${overdueCount} overdue deadline${overdueCount > 1 ? "s" : ""}`);
|
|
32
|
+
}
|
|
33
|
+
// Deadlines this week
|
|
34
|
+
const thisWeekDeadlines = cActiveDeadlines.filter((d) => {
|
|
35
|
+
const du = daysUntil(d.dueDate);
|
|
36
|
+
return du >= 0 && du <= 7;
|
|
37
|
+
});
|
|
38
|
+
if (thisWeekDeadlines.length > 0) {
|
|
39
|
+
score += 25;
|
|
40
|
+
reasons.push(`${thisWeekDeadlines.length} deadline${thisWeekDeadlines.length > 1 ? "s" : ""} this week`);
|
|
41
|
+
}
|
|
42
|
+
// Stale client (no interaction in 30+ days)
|
|
43
|
+
if (!client.lastInteraction || daysSince(client.lastInteraction) > 30) {
|
|
44
|
+
score += 15;
|
|
45
|
+
const since = client.lastInteraction
|
|
46
|
+
? formatRelative(client.lastInteraction)
|
|
47
|
+
: "never";
|
|
48
|
+
reasons.push(`Last contact: ${since}`);
|
|
49
|
+
}
|
|
50
|
+
// Poor health
|
|
51
|
+
if (health.band === "Critical") {
|
|
52
|
+
score += 20;
|
|
53
|
+
reasons.push(`Health: Critical (${health.score}/100)`);
|
|
54
|
+
}
|
|
55
|
+
else if (health.band === "At Risk") {
|
|
56
|
+
score += 10;
|
|
57
|
+
reasons.push(`Health: At Risk (${health.score}/100)`);
|
|
58
|
+
}
|
|
59
|
+
// High-value client gets a small boost
|
|
60
|
+
if (client.engagement.value && client.engagement.value >= 2000) {
|
|
61
|
+
score += 5;
|
|
62
|
+
}
|
|
63
|
+
if (reasons.length > 0) {
|
|
64
|
+
priorities.push({
|
|
65
|
+
name: client.name,
|
|
66
|
+
slug: client.slug,
|
|
67
|
+
score,
|
|
68
|
+
reasons,
|
|
69
|
+
healthBand: health.band,
|
|
70
|
+
healthScore: health.score,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Sort by priority score descending
|
|
75
|
+
priorities.sort((a, b) => b.score - a.score);
|
|
76
|
+
if (priorities.length === 0) {
|
|
77
|
+
return `Week of ${startOfWeek()} to ${endOfWeek()}\n\nAll clients are in good standing. No urgent priorities this week.`;
|
|
78
|
+
}
|
|
79
|
+
const sections = [];
|
|
80
|
+
sections.push(`WEEK PRIORITIES — ${startOfWeek()} to ${endOfWeek()}`);
|
|
81
|
+
sections.push("=".repeat(50));
|
|
82
|
+
sections.push("");
|
|
83
|
+
for (let i = 0; i < Math.min(priorities.length, 20); i++) {
|
|
84
|
+
const p = priorities[i];
|
|
85
|
+
sections.push(`${i + 1}. ${p.name} (priority score: ${p.score})`);
|
|
86
|
+
sections.push(` Health: ${p.healthBand} (${p.healthScore}/100)`);
|
|
87
|
+
for (const reason of p.reasons) {
|
|
88
|
+
sections.push(` - ${reason}`);
|
|
89
|
+
}
|
|
90
|
+
sections.push("");
|
|
91
|
+
}
|
|
92
|
+
if (priorities.length > 20) {
|
|
93
|
+
sections.push(`... and ${priorities.length - 20} more clients with lower priority`);
|
|
94
|
+
}
|
|
95
|
+
sections.push(`Total clients needing attention: ${priorities.length}/${clients.length}`);
|
|
96
|
+
return sections.join("\n");
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=week-priorities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"week-priorities.js","sourceRoot":"","sources":["../../src/tools/week-priorities.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Date utility functions for the Practiq MCP server.
|
|
3
|
+
* All dates are ISO 8601 strings. No external dependencies.
|
|
4
|
+
*/
|
|
5
|
+
export declare function now(): string;
|
|
6
|
+
export declare function today(): string;
|
|
7
|
+
export declare function daysBetween(dateA: string, dateB: string): number;
|
|
8
|
+
export declare function daysSince(date: string): number;
|
|
9
|
+
export declare function daysUntil(date: string): number;
|
|
10
|
+
export declare function isOverdue(dueDate: string): boolean;
|
|
11
|
+
export declare function isWithinDays(date: string, days: number): boolean;
|
|
12
|
+
export declare function formatRelative(date: string): string;
|
|
13
|
+
export declare function formatDueRelative(date: string): string;
|
|
14
|
+
/** Start of the current week (Monday) as ISO date string */
|
|
15
|
+
export declare function startOfWeek(): string;
|
|
16
|
+
/** End of the current week (Sunday) as ISO date string */
|
|
17
|
+
export declare function endOfWeek(): string;
|
|
18
|
+
//# sourceMappingURL=date-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-utils.d.ts","sourceRoot":"","sources":["../../src/utils/date-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAgB,GAAG,IAAI,MAAM,CAE5B;AAED,wBAAgB,KAAK,IAAI,MAAM,CAE9B;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI9C;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAGhE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQnD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQtD;AAED,4DAA4D;AAC5D,wBAAgB,WAAW,IAAI,MAAM,CAMpC;AAED,0DAA0D;AAC1D,wBAAgB,SAAS,IAAI,MAAM,CAMlC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Date utility functions for the Practiq MCP server.
|
|
3
|
+
* All dates are ISO 8601 strings. No external dependencies.
|
|
4
|
+
*/
|
|
5
|
+
export function now() {
|
|
6
|
+
return new Date().toISOString();
|
|
7
|
+
}
|
|
8
|
+
export function today() {
|
|
9
|
+
return new Date().toISOString().slice(0, 10);
|
|
10
|
+
}
|
|
11
|
+
export function daysBetween(dateA, dateB) {
|
|
12
|
+
const a = new Date(dateA).getTime();
|
|
13
|
+
const b = new Date(dateB).getTime();
|
|
14
|
+
return Math.floor(Math.abs(b - a) / (1000 * 60 * 60 * 24));
|
|
15
|
+
}
|
|
16
|
+
export function daysSince(date) {
|
|
17
|
+
return daysBetween(date, now());
|
|
18
|
+
}
|
|
19
|
+
export function daysUntil(date) {
|
|
20
|
+
const target = new Date(date).getTime();
|
|
21
|
+
const current = Date.now();
|
|
22
|
+
return Math.floor((target - current) / (1000 * 60 * 60 * 24));
|
|
23
|
+
}
|
|
24
|
+
export function isOverdue(dueDate) {
|
|
25
|
+
return new Date(dueDate).getTime() < Date.now();
|
|
26
|
+
}
|
|
27
|
+
export function isWithinDays(date, days) {
|
|
28
|
+
const d = daysUntil(date);
|
|
29
|
+
return d >= 0 && d <= days;
|
|
30
|
+
}
|
|
31
|
+
export function formatRelative(date) {
|
|
32
|
+
const d = daysSince(date);
|
|
33
|
+
if (d === 0)
|
|
34
|
+
return "today";
|
|
35
|
+
if (d === 1)
|
|
36
|
+
return "yesterday";
|
|
37
|
+
if (d < 7)
|
|
38
|
+
return `${d} days ago`;
|
|
39
|
+
if (d < 30)
|
|
40
|
+
return `${Math.floor(d / 7)} weeks ago`;
|
|
41
|
+
if (d < 365)
|
|
42
|
+
return `${Math.floor(d / 30)} months ago`;
|
|
43
|
+
return `${Math.floor(d / 365)} years ago`;
|
|
44
|
+
}
|
|
45
|
+
export function formatDueRelative(date) {
|
|
46
|
+
const d = daysUntil(date);
|
|
47
|
+
if (d < 0)
|
|
48
|
+
return `${Math.abs(d)} days overdue`;
|
|
49
|
+
if (d === 0)
|
|
50
|
+
return "due today";
|
|
51
|
+
if (d === 1)
|
|
52
|
+
return "due tomorrow";
|
|
53
|
+
if (d < 7)
|
|
54
|
+
return `due in ${d} days`;
|
|
55
|
+
if (d < 30)
|
|
56
|
+
return `due in ${Math.floor(d / 7)} weeks`;
|
|
57
|
+
return `due in ${Math.floor(d / 30)} months`;
|
|
58
|
+
}
|
|
59
|
+
/** Start of the current week (Monday) as ISO date string */
|
|
60
|
+
export function startOfWeek() {
|
|
61
|
+
const d = new Date();
|
|
62
|
+
const day = d.getDay();
|
|
63
|
+
const diff = d.getDate() - day + (day === 0 ? -6 : 1);
|
|
64
|
+
const monday = new Date(d.setDate(diff));
|
|
65
|
+
return monday.toISOString().slice(0, 10);
|
|
66
|
+
}
|
|
67
|
+
/** End of the current week (Sunday) as ISO date string */
|
|
68
|
+
export function endOfWeek() {
|
|
69
|
+
const d = new Date();
|
|
70
|
+
const day = d.getDay();
|
|
71
|
+
const diff = d.getDate() - day + (day === 0 ? 0 : 7);
|
|
72
|
+
const sunday = new Date(d.setDate(diff));
|
|
73
|
+
return sunday.toISOString().slice(0, 10);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=date-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-utils.js","sourceRoot":"","sources":["../../src/utils/date-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client health scoring algorithm.
|
|
3
|
+
*
|
|
4
|
+
* Four dimensions, each scored 0-100:
|
|
5
|
+
* 1. Interaction recency — when was the last touch?
|
|
6
|
+
* 2. Deadline status — any overdue deadlines?
|
|
7
|
+
* 3. Engagement depth — how many interactions total?
|
|
8
|
+
* 4. Risk signals — any negative keywords in notes/interactions?
|
|
9
|
+
*
|
|
10
|
+
* Final score = weighted average. Band thresholds:
|
|
11
|
+
* 80-100 = Healthy
|
|
12
|
+
* 60-79 = Watch
|
|
13
|
+
* 40-59 = At Risk
|
|
14
|
+
* 0-39 = Critical
|
|
15
|
+
*/
|
|
16
|
+
import type { Client, Deadline, HealthResult, Interaction } from "../store/types.js";
|
|
17
|
+
export declare function computeHealth(client: Client, interactions: Interaction[], deadlines: Deadline[]): HealthResult;
|
|
18
|
+
//# sourceMappingURL=scoring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoring.d.ts","sourceRoot":"","sources":["../../src/utils/scoring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,MAAM,EACN,QAAQ,EAGR,YAAY,EACZ,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAmH3B,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,WAAW,EAAE,EAC3B,SAAS,EAAE,QAAQ,EAAE,GACpB,YAAY,CAyBd"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client health scoring algorithm.
|
|
3
|
+
*
|
|
4
|
+
* Four dimensions, each scored 0-100:
|
|
5
|
+
* 1. Interaction recency — when was the last touch?
|
|
6
|
+
* 2. Deadline status — any overdue deadlines?
|
|
7
|
+
* 3. Engagement depth — how many interactions total?
|
|
8
|
+
* 4. Risk signals — any negative keywords in notes/interactions?
|
|
9
|
+
*
|
|
10
|
+
* Final score = weighted average. Band thresholds:
|
|
11
|
+
* 80-100 = Healthy
|
|
12
|
+
* 60-79 = Watch
|
|
13
|
+
* 40-59 = At Risk
|
|
14
|
+
* 0-39 = Critical
|
|
15
|
+
*/
|
|
16
|
+
import { daysSince } from "./date-utils.js";
|
|
17
|
+
const RISK_KEYWORDS = [
|
|
18
|
+
"unhappy",
|
|
19
|
+
"frustrated",
|
|
20
|
+
"cancel",
|
|
21
|
+
"terminate",
|
|
22
|
+
"complaint",
|
|
23
|
+
"dispute",
|
|
24
|
+
"overdue",
|
|
25
|
+
"late payment",
|
|
26
|
+
"at risk",
|
|
27
|
+
"churn",
|
|
28
|
+
"dissatisfied",
|
|
29
|
+
"escalat",
|
|
30
|
+
"problem",
|
|
31
|
+
"issue",
|
|
32
|
+
"concern",
|
|
33
|
+
];
|
|
34
|
+
function scoreInteractionRecency(lastInteraction) {
|
|
35
|
+
if (!lastInteraction)
|
|
36
|
+
return 0;
|
|
37
|
+
const days = daysSince(lastInteraction);
|
|
38
|
+
if (days <= 7)
|
|
39
|
+
return 100;
|
|
40
|
+
if (days <= 14)
|
|
41
|
+
return 85;
|
|
42
|
+
if (days <= 30)
|
|
43
|
+
return 70;
|
|
44
|
+
if (days <= 60)
|
|
45
|
+
return 50;
|
|
46
|
+
if (days <= 90)
|
|
47
|
+
return 30;
|
|
48
|
+
return 10;
|
|
49
|
+
}
|
|
50
|
+
function scoreDeadlineStatus(deadlines) {
|
|
51
|
+
if (deadlines.length === 0)
|
|
52
|
+
return 80; // no deadlines = neutral-good
|
|
53
|
+
const activeDeadlines = deadlines.filter((d) => !d.completed);
|
|
54
|
+
if (activeDeadlines.length === 0)
|
|
55
|
+
return 100;
|
|
56
|
+
const overdueCount = activeDeadlines.filter((d) => new Date(d.dueDate).getTime() < Date.now()).length;
|
|
57
|
+
if (overdueCount === 0)
|
|
58
|
+
return 90;
|
|
59
|
+
const overdueRatio = overdueCount / activeDeadlines.length;
|
|
60
|
+
if (overdueRatio <= 0.25)
|
|
61
|
+
return 60;
|
|
62
|
+
if (overdueRatio <= 0.5)
|
|
63
|
+
return 40;
|
|
64
|
+
return 20;
|
|
65
|
+
}
|
|
66
|
+
function scoreEngagementDepth(interactions) {
|
|
67
|
+
const count = interactions.length;
|
|
68
|
+
if (count >= 20)
|
|
69
|
+
return 100;
|
|
70
|
+
if (count >= 10)
|
|
71
|
+
return 80;
|
|
72
|
+
if (count >= 5)
|
|
73
|
+
return 60;
|
|
74
|
+
if (count >= 2)
|
|
75
|
+
return 40;
|
|
76
|
+
if (count >= 1)
|
|
77
|
+
return 25;
|
|
78
|
+
return 10;
|
|
79
|
+
}
|
|
80
|
+
function scoreRiskSignals(client, interactions) {
|
|
81
|
+
let riskCount = 0;
|
|
82
|
+
const searchText = [
|
|
83
|
+
client.notes,
|
|
84
|
+
...interactions.map((i) => i.summary),
|
|
85
|
+
...interactions.flatMap((i) => i.actionItems),
|
|
86
|
+
]
|
|
87
|
+
.join(" ")
|
|
88
|
+
.toLowerCase();
|
|
89
|
+
for (const keyword of RISK_KEYWORDS) {
|
|
90
|
+
if (searchText.includes(keyword)) {
|
|
91
|
+
riskCount++;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (riskCount === 0)
|
|
95
|
+
return 100;
|
|
96
|
+
if (riskCount <= 1)
|
|
97
|
+
return 75;
|
|
98
|
+
if (riskCount <= 3)
|
|
99
|
+
return 50;
|
|
100
|
+
if (riskCount <= 5)
|
|
101
|
+
return 30;
|
|
102
|
+
return 10;
|
|
103
|
+
}
|
|
104
|
+
function getBand(score) {
|
|
105
|
+
if (score >= 80)
|
|
106
|
+
return "Healthy";
|
|
107
|
+
if (score >= 60)
|
|
108
|
+
return "Watch";
|
|
109
|
+
if (score >= 40)
|
|
110
|
+
return "At Risk";
|
|
111
|
+
return "Critical";
|
|
112
|
+
}
|
|
113
|
+
function buildSummary(dimensions, band) {
|
|
114
|
+
const parts = [];
|
|
115
|
+
if (dimensions.interactionRecency < 50) {
|
|
116
|
+
parts.push("No recent interaction — consider reaching out");
|
|
117
|
+
}
|
|
118
|
+
if (dimensions.deadlineStatus < 50) {
|
|
119
|
+
parts.push("Overdue deadlines need attention");
|
|
120
|
+
}
|
|
121
|
+
if (dimensions.engagementDepth < 40) {
|
|
122
|
+
parts.push("Low engagement depth — relationship may need nurturing");
|
|
123
|
+
}
|
|
124
|
+
if (dimensions.riskSignals < 50) {
|
|
125
|
+
parts.push("Risk signals detected in notes or interactions");
|
|
126
|
+
}
|
|
127
|
+
if (parts.length === 0) {
|
|
128
|
+
if (band === "Healthy")
|
|
129
|
+
return "Client is in good standing across all dimensions.";
|
|
130
|
+
return "Client status is acceptable but monitor for changes.";
|
|
131
|
+
}
|
|
132
|
+
return parts.join(". ") + ".";
|
|
133
|
+
}
|
|
134
|
+
export function computeHealth(client, interactions, deadlines) {
|
|
135
|
+
const dimensions = {
|
|
136
|
+
interactionRecency: scoreInteractionRecency(client.lastInteraction),
|
|
137
|
+
deadlineStatus: scoreDeadlineStatus(deadlines),
|
|
138
|
+
engagementDepth: scoreEngagementDepth(interactions),
|
|
139
|
+
riskSignals: scoreRiskSignals(client, interactions),
|
|
140
|
+
};
|
|
141
|
+
const score = Math.round(dimensions.interactionRecency * 0.30 +
|
|
142
|
+
dimensions.deadlineStatus * 0.30 +
|
|
143
|
+
dimensions.engagementDepth * 0.15 +
|
|
144
|
+
dimensions.riskSignals * 0.25);
|
|
145
|
+
const band = getBand(score);
|
|
146
|
+
return {
|
|
147
|
+
clientSlug: client.slug,
|
|
148
|
+
clientName: client.name,
|
|
149
|
+
score,
|
|
150
|
+
band,
|
|
151
|
+
dimensions,
|
|
152
|
+
summary: buildSummary(dimensions, band),
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=scoring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../src/utils/scoring.ts"],"names":[],"mappings":"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"}
|