elasticsearch-mcp-vsee-stage 0.5.13

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.
Files changed (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +304 -0
  3. package/build/config.d.ts +76 -0
  4. package/build/config.d.ts.map +1 -0
  5. package/build/config.js +63 -0
  6. package/build/config.js.map +1 -0
  7. package/build/elasticsearch/client.d.ts +26 -0
  8. package/build/elasticsearch/client.d.ts.map +1 -0
  9. package/build/elasticsearch/client.js +131 -0
  10. package/build/elasticsearch/client.js.map +1 -0
  11. package/build/errors/handlers.d.ts +44 -0
  12. package/build/errors/handlers.d.ts.map +1 -0
  13. package/build/errors/handlers.js +231 -0
  14. package/build/errors/handlers.js.map +1 -0
  15. package/build/index.d.ts +9 -0
  16. package/build/index.d.ts.map +1 -0
  17. package/build/index.js +28 -0
  18. package/build/index.js.map +1 -0
  19. package/build/logger.d.ts +31 -0
  20. package/build/logger.d.ts.map +1 -0
  21. package/build/logger.js +81 -0
  22. package/build/logger.js.map +1 -0
  23. package/build/server.d.ts +23 -0
  24. package/build/server.d.ts.map +1 -0
  25. package/build/server.js +571 -0
  26. package/build/server.js.map +1 -0
  27. package/build/tools/find-entities-by-metric.d.ts +51 -0
  28. package/build/tools/find-entities-by-metric.d.ts.map +1 -0
  29. package/build/tools/find-entities-by-metric.js +375 -0
  30. package/build/tools/find-entities-by-metric.js.map +1 -0
  31. package/build/tools/get-index-fields.d.ts +26 -0
  32. package/build/tools/get-index-fields.d.ts.map +1 -0
  33. package/build/tools/get-index-fields.js +94 -0
  34. package/build/tools/get-index-fields.js.map +1 -0
  35. package/build/tools/get-platform-breakdown.d.ts +42 -0
  36. package/build/tools/get-platform-breakdown.d.ts.map +1 -0
  37. package/build/tools/get-platform-breakdown.js +305 -0
  38. package/build/tools/get-platform-breakdown.js.map +1 -0
  39. package/build/tools/get-rating-distribution.d.ts +48 -0
  40. package/build/tools/get-rating-distribution.d.ts.map +1 -0
  41. package/build/tools/get-rating-distribution.js +283 -0
  42. package/build/tools/get-rating-distribution.js.map +1 -0
  43. package/build/tools/get-subscription-breakdown.d.ts +34 -0
  44. package/build/tools/get-subscription-breakdown.d.ts.map +1 -0
  45. package/build/tools/get-subscription-breakdown.js +179 -0
  46. package/build/tools/get-subscription-breakdown.js.map +1 -0
  47. package/build/tools/get-usage-leaderboard.d.ts +38 -0
  48. package/build/tools/get-usage-leaderboard.d.ts.map +1 -0
  49. package/build/tools/get-usage-leaderboard.js +177 -0
  50. package/build/tools/get-usage-leaderboard.js.map +1 -0
  51. package/build/tools/get-usage-profile.d.ts +52 -0
  52. package/build/tools/get-usage-profile.d.ts.map +1 -0
  53. package/build/tools/get-usage-profile.js +273 -0
  54. package/build/tools/get-usage-profile.js.map +1 -0
  55. package/build/tools/get-visit-trends.d.ts +37 -0
  56. package/build/tools/get-visit-trends.d.ts.map +1 -0
  57. package/build/tools/get-visit-trends.js +289 -0
  58. package/build/tools/get-visit-trends.js.map +1 -0
  59. package/build/tools/index.d.ts +19 -0
  60. package/build/tools/index.d.ts.map +1 -0
  61. package/build/tools/index.js +22 -0
  62. package/build/tools/index.js.map +1 -0
  63. package/build/tools/top-change.d.ts +34 -0
  64. package/build/tools/top-change.d.ts.map +1 -0
  65. package/build/tools/top-change.js +262 -0
  66. package/build/tools/top-change.js.map +1 -0
  67. package/build/utils/aggregation-limits.d.ts +23 -0
  68. package/build/utils/aggregation-limits.d.ts.map +1 -0
  69. package/build/utils/aggregation-limits.js +32 -0
  70. package/build/utils/aggregation-limits.js.map +1 -0
  71. package/build/utils/date-math.d.ts +31 -0
  72. package/build/utils/date-math.d.ts.map +1 -0
  73. package/build/utils/date-math.js +116 -0
  74. package/build/utils/date-math.js.map +1 -0
  75. package/build/utils/field-constants.d.ts +23 -0
  76. package/build/utils/field-constants.d.ts.map +1 -0
  77. package/build/utils/field-constants.js +26 -0
  78. package/build/utils/field-constants.js.map +1 -0
  79. package/build/validation/schemas.d.ts +243 -0
  80. package/build/validation/schemas.d.ts.map +1 -0
  81. package/build/validation/schemas.js +151 -0
  82. package/build/validation/schemas.js.map +1 -0
  83. package/package.json +65 -0
@@ -0,0 +1,273 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GetUsageProfileTool = void 0;
4
+ const zod_1 = require("zod");
5
+ const handlers_js_1 = require("../errors/handlers.js");
6
+ const aggregation_limits_js_1 = require("../utils/aggregation-limits.js");
7
+ const field_constants_js_1 = require("../utils/field-constants.js");
8
+ const GetUsageProfileArgsSchema = zod_1.z.object({
9
+ startDate: zod_1.z.string().optional().describe('Start date in ISO format (YYYY-MM-DD) or date math (e.g., "now-30d", "now-1y"). Defaults to "now-30d"'),
10
+ endDate: zod_1.z.string().optional().describe('End date in ISO format (YYYY-MM-DD) or date math (e.g., "now"). Defaults to "now"'),
11
+ account: zod_1.z.string().optional().describe('Optional account name to filter by'),
12
+ group: zod_1.z.string().optional().describe('Optional group name to filter by'),
13
+ subscription: zod_1.z.string().optional().describe('Optional subscription tier to filter by'),
14
+ groupBy: zod_1.z.enum(['none', 'subscription', 'account', 'group']).optional().default('none').describe('Optional grouping dimension (default: none). When set, returns separate summaries for each group value.'),
15
+ }).strict();
16
+ class GetUsageProfileTool {
17
+ elasticsearch;
18
+ logger;
19
+ constructor(elasticsearch, logger) {
20
+ this.elasticsearch = elasticsearch;
21
+ this.logger = logger.child({ tool: 'get-usage-profile' });
22
+ }
23
+ async execute(args) {
24
+ try {
25
+ const validatedArgs = GetUsageProfileArgsSchema.parse(args);
26
+ let startDate = validatedArgs.startDate || 'now-30d';
27
+ let endDate = validatedArgs.endDate || 'now';
28
+ const groupBy = validatedArgs.groupBy || 'none';
29
+ this.logger.info('Executing usage profile', {
30
+ startDate,
31
+ endDate,
32
+ account: validatedArgs.account,
33
+ group: validatedArgs.group,
34
+ subscription: validatedArgs.subscription,
35
+ groupBy,
36
+ });
37
+ const client = this.elasticsearch.getClient();
38
+ const index = field_constants_js_1.FIELD_CONSTANTS.index;
39
+ const timeField = field_constants_js_1.FIELD_CONSTANTS.timeField;
40
+ const testVisitField = field_constants_js_1.FIELD_CONSTANTS.testVisitField;
41
+ const accountField = field_constants_js_1.FIELD_CONSTANTS.accountField;
42
+ const groupField = field_constants_js_1.FIELD_CONSTANTS.groupField;
43
+ const subscriptionField = field_constants_js_1.FIELD_CONSTANTS.subscriptionField;
44
+ const providerField = field_constants_js_1.FIELD_CONSTANTS.providerField;
45
+ const patientField = field_constants_js_1.FIELD_CONSTANTS.patientField;
46
+ const providerPlatformField = field_constants_js_1.FIELD_CONSTANTS.providerPlatformField;
47
+ const patientPlatformField = field_constants_js_1.FIELD_CONSTANTS.patientPlatformField;
48
+ const callDurationField = field_constants_js_1.FIELD_CONSTANTS.callDurationField;
49
+ const providerRatingField = field_constants_js_1.FIELD_CONSTANTS.providerRatingField;
50
+ const patientRatingField = field_constants_js_1.FIELD_CONSTANTS.patientRatingField;
51
+ const meetingBasedField = field_constants_js_1.FIELD_CONSTANTS.meetingBasedField;
52
+ const filters = [
53
+ {
54
+ range: {
55
+ [timeField]: {
56
+ gte: startDate,
57
+ lt: endDate,
58
+ },
59
+ },
60
+ },
61
+ {
62
+ term: {
63
+ [testVisitField]: 'No',
64
+ },
65
+ },
66
+ {
67
+ bool: {
68
+ should: [
69
+ { exists: { field: callDurationField } },
70
+ { term: { [meetingBasedField]: false } },
71
+ ],
72
+ minimum_should_match: 1,
73
+ },
74
+ },
75
+ ];
76
+ if (validatedArgs.account) {
77
+ filters.push({
78
+ term: {
79
+ [accountField]: validatedArgs.account,
80
+ },
81
+ });
82
+ }
83
+ if (validatedArgs.group) {
84
+ filters.push({
85
+ term: {
86
+ [groupField]: validatedArgs.group,
87
+ },
88
+ });
89
+ }
90
+ if (validatedArgs.subscription) {
91
+ filters.push({
92
+ term: {
93
+ [subscriptionField]: validatedArgs.subscription,
94
+ },
95
+ });
96
+ }
97
+ const buildSummaryAggs = () => ({
98
+ total_visits: {
99
+ value_count: { field: timeField },
100
+ },
101
+ unique_accounts: {
102
+ cardinality: { field: accountField },
103
+ },
104
+ unique_groups: {
105
+ cardinality: { field: groupField },
106
+ },
107
+ unique_providers: {
108
+ cardinality: { field: providerField },
109
+ },
110
+ unique_patients: {
111
+ cardinality: { field: patientField },
112
+ },
113
+ avg_call_duration: {
114
+ avg: { field: callDurationField },
115
+ },
116
+ sum_call_duration: {
117
+ sum: { field: callDurationField },
118
+ },
119
+ provider_rating_count: {
120
+ value_count: { field: providerRatingField },
121
+ },
122
+ avg_provider_rating: {
123
+ avg: { field: providerRatingField },
124
+ },
125
+ patient_rating_count: {
126
+ value_count: { field: patientRatingField },
127
+ },
128
+ avg_patient_rating: {
129
+ avg: { field: patientRatingField },
130
+ },
131
+ subscription_distribution: {
132
+ terms: {
133
+ field: subscriptionField,
134
+ size: aggregation_limits_js_1.AGGREGATION_LIMITS.MEDIUM,
135
+ },
136
+ },
137
+ provider_platform_distribution: {
138
+ terms: {
139
+ field: providerPlatformField,
140
+ size: aggregation_limits_js_1.AGGREGATION_LIMITS.MEDIUM,
141
+ },
142
+ },
143
+ patient_platform_distribution: {
144
+ terms: {
145
+ field: patientPlatformField,
146
+ size: aggregation_limits_js_1.AGGREGATION_LIMITS.MEDIUM,
147
+ },
148
+ },
149
+ });
150
+ let aggs;
151
+ if (groupBy === 'none') {
152
+ aggs = buildSummaryAggs();
153
+ }
154
+ else {
155
+ let groupFieldName;
156
+ switch (groupBy) {
157
+ case 'subscription':
158
+ groupFieldName = subscriptionField;
159
+ break;
160
+ case 'account':
161
+ groupFieldName = accountField;
162
+ break;
163
+ case 'group':
164
+ groupFieldName = groupField;
165
+ break;
166
+ default:
167
+ groupFieldName = subscriptionField;
168
+ }
169
+ aggs = {
170
+ by_group: {
171
+ terms: {
172
+ field: groupFieldName,
173
+ size: aggregation_limits_js_1.AGGREGATION_LIMITS.MEDIUM, // Safeguard: cap at 50 to prevent data limits
174
+ },
175
+ aggs: buildSummaryAggs(),
176
+ },
177
+ };
178
+ }
179
+ const query = {
180
+ index,
181
+ size: 0,
182
+ body: {
183
+ query: {
184
+ bool: {
185
+ filter: filters,
186
+ },
187
+ },
188
+ aggs,
189
+ },
190
+ };
191
+ this.logger.debug('Executing query', { query: JSON.stringify(query, null, 2) });
192
+ const response = await client.search(query);
193
+ const responseAggs = response.aggregations;
194
+ const processSummaryItem = (itemAggs) => {
195
+ const totalVisits = itemAggs?.total_visits?.value || 0;
196
+ const subscriptionBuckets = itemAggs?.subscription_distribution?.buckets || [];
197
+ const subscriptionDistribution = subscriptionBuckets.map((bucket) => ({
198
+ subscription: bucket.key,
199
+ count: bucket.doc_count || 0,
200
+ percentage: totalVisits > 0 ? Math.round((bucket.doc_count / totalVisits) * 100 * 100) / 100 : 0,
201
+ }));
202
+ const providerPlatformBuckets = itemAggs?.provider_platform_distribution?.buckets || [];
203
+ const providerPlatformDistribution = providerPlatformBuckets.map((bucket) => ({
204
+ platform: bucket.key,
205
+ count: bucket.doc_count || 0,
206
+ percentage: totalVisits > 0 ? Math.round((bucket.doc_count / totalVisits) * 100 * 100) / 100 : 0,
207
+ }));
208
+ const patientPlatformBuckets = itemAggs?.patient_platform_distribution?.buckets || [];
209
+ const patientPlatformDistribution = patientPlatformBuckets.map((bucket) => ({
210
+ platform: bucket.key,
211
+ count: bucket.doc_count || 0,
212
+ percentage: totalVisits > 0 ? Math.round((bucket.doc_count / totalVisits) * 100 * 100) / 100 : 0,
213
+ }));
214
+ const avgCallDuration = itemAggs?.avg_call_duration?.value || null;
215
+ const sumCallDuration = itemAggs?.sum_call_duration?.value || null;
216
+ const totalCallDurationHours = sumCallDuration ? Math.round((sumCallDuration / 3600) * 100) / 100 : null;
217
+ return {
218
+ total_visits: totalVisits,
219
+ unique_accounts: itemAggs?.unique_accounts?.value || 0,
220
+ unique_groups: itemAggs?.unique_groups?.value || 0,
221
+ unique_providers: itemAggs?.unique_providers?.value || 0,
222
+ unique_patients: itemAggs?.unique_patients?.value || 0,
223
+ avg_call_duration_seconds: avgCallDuration ? Math.round(avgCallDuration * 100) / 100 : null,
224
+ total_call_duration_hours: totalCallDurationHours,
225
+ provider_rating_count: itemAggs?.provider_rating_count?.value || 0,
226
+ avg_provider_rating: itemAggs?.avg_provider_rating?.value ? Math.round(itemAggs.avg_provider_rating.value * 100) / 100 : null,
227
+ patient_rating_count: itemAggs?.patient_rating_count?.value || 0,
228
+ avg_patient_rating: itemAggs?.avg_patient_rating?.value ? Math.round(itemAggs.avg_patient_rating.value * 100) / 100 : null,
229
+ subscription_distribution: subscriptionDistribution,
230
+ provider_platform_distribution: providerPlatformDistribution,
231
+ patient_platform_distribution: patientPlatformDistribution,
232
+ };
233
+ };
234
+ let summary;
235
+ if (groupBy === 'none') {
236
+ summary = processSummaryItem(responseAggs);
237
+ }
238
+ else {
239
+ const valueKey = `${groupBy}_value`;
240
+ const groupBuckets = responseAggs?.by_group?.buckets || [];
241
+ summary = groupBuckets.map((bucket) => ({
242
+ [valueKey]: bucket.key,
243
+ ...processSummaryItem(bucket),
244
+ }));
245
+ }
246
+ this.logger.info('Successfully retrieved usage summary', {
247
+ groupBy,
248
+ itemCount: Array.isArray(summary) ? summary.length : 1,
249
+ });
250
+ return {
251
+ period: `${startDate} to ${endDate}`,
252
+ startDate,
253
+ endDate,
254
+ groupBy,
255
+ summary,
256
+ };
257
+ }
258
+ catch (error) {
259
+ if (error instanceof Error && error.name === 'ZodError') {
260
+ throw new handlers_js_1.ValidationError('Invalid arguments for get_usage_summary', {
261
+ details: error.message,
262
+ });
263
+ }
264
+ if (error instanceof handlers_js_1.ValidationError) {
265
+ throw error;
266
+ }
267
+ this.logger.error('Failed to get usage summary', {}, error);
268
+ throw new handlers_js_1.ElasticsearchError('Failed to get usage profile', error, { args });
269
+ }
270
+ }
271
+ }
272
+ exports.GetUsageProfileTool = GetUsageProfileTool;
273
+ //# sourceMappingURL=get-usage-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-usage-profile.js","sourceRoot":"","sources":["../../src/tools/get-usage-profile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { ElasticsearchManager } from '../elasticsearch/client.js';
2
+ import { Logger } from '../logger.js';
3
+ export interface GetVisitTrendsArgs {
4
+ interval: 'daily' | 'weekly' | 'monthly';
5
+ startDate?: string;
6
+ endDate?: string;
7
+ groupBy?: 'none' | 'subscription' | 'account' | 'group';
8
+ account?: string;
9
+ group?: string;
10
+ subscription?: 'Enterprise' | 'Premium' | 'FVC' | 'BVC' | 'Plus';
11
+ }
12
+ export interface TrendDataPoint {
13
+ date: string;
14
+ count: number;
15
+ unique_accounts?: number;
16
+ unique_providers?: number;
17
+ unique_patients?: number;
18
+ }
19
+ export interface GroupedTrendData extends Record<string, any> {
20
+ data_points: TrendDataPoint[];
21
+ }
22
+ export interface VisitTrendsResult {
23
+ interval: string;
24
+ period: string;
25
+ startDate: string;
26
+ endDate: string;
27
+ trends: TrendDataPoint[] | GroupedTrendData[];
28
+ total_visits: number;
29
+ average_per_period: number;
30
+ }
31
+ export declare class GetVisitTrendsTool {
32
+ private elasticsearch;
33
+ private logger;
34
+ constructor(elasticsearch: ElasticsearchManager, logger: Logger);
35
+ execute(args: unknown): Promise<VisitTrendsResult>;
36
+ }
37
+ //# sourceMappingURL=get-visit-trends.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-visit-trends.d.ts","sourceRoot":"","sources":["../../src/tools/get-visit-trends.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAgBtC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,GAAG,OAAO,CAAC;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,YAAY,GAAG,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;CAClE;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAiB,SAAQ,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAC3D,WAAW,EAAE,cAAc,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,cAAc,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAC9C,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,MAAM,CAAS;gBAEX,aAAa,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM;IAKzD,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAkSzD"}
@@ -0,0 +1,289 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GetVisitTrendsTool = void 0;
4
+ const zod_1 = require("zod");
5
+ const handlers_js_1 = require("../errors/handlers.js");
6
+ const aggregation_limits_js_1 = require("../utils/aggregation-limits.js");
7
+ const field_constants_js_1 = require("../utils/field-constants.js");
8
+ const GetVisitTrendsArgsSchema = zod_1.z.object({
9
+ interval: zod_1.z.enum(['daily', 'weekly', 'monthly']).describe('Time interval for trends: "daily", "weekly", or "monthly"'),
10
+ startDate: zod_1.z.string().optional().describe('Start date in ISO format (YYYY-MM-DD) or date math (e.g., "now-180d", "now-1y"). Defaults to "now-180d" (6 months)'),
11
+ endDate: zod_1.z.string().optional().describe('End date in ISO format (YYYY-MM-DD) or date math (e.g., "now"). Defaults to "now"'),
12
+ groupBy: zod_1.z.enum(['none', 'subscription', 'account', 'group']).optional().default('none').describe('Optional grouping dimension (default: none)'),
13
+ account: zod_1.z.string().optional().describe('Optional account name to filter by'),
14
+ group: zod_1.z.string().optional().describe('Optional group name to filter by'),
15
+ subscription: zod_1.z.enum(['Enterprise', 'Premium', 'FVC', 'BVC', 'Plus']).optional().describe('Optional subscription tier to filter by'),
16
+ }).strict();
17
+ class GetVisitTrendsTool {
18
+ elasticsearch;
19
+ logger;
20
+ constructor(elasticsearch, logger) {
21
+ this.elasticsearch = elasticsearch;
22
+ this.logger = logger.child({ tool: 'get-visit-trends' });
23
+ }
24
+ async execute(args) {
25
+ try {
26
+ const validatedArgs = GetVisitTrendsArgsSchema.parse(args);
27
+ let startDate = validatedArgs.startDate || 'now-180d';
28
+ const endDate = validatedArgs.endDate || 'now';
29
+ const groupBy = validatedArgs.groupBy || 'none';
30
+ // Calculate estimated buckets for logging
31
+ const parseDateMathDays = (dateMath) => {
32
+ const match = dateMath.match(/now-(\d+)([dwMy])/i);
33
+ if (!match)
34
+ return 90;
35
+ const value = parseInt(match[1], 10);
36
+ const unit = match[2].toLowerCase();
37
+ switch (unit) {
38
+ case 'd': return value;
39
+ case 'w': return value * 7;
40
+ case 'm': return value * 30;
41
+ case 'y': return value * 365;
42
+ default: return value;
43
+ }
44
+ };
45
+ const calculateBuckets = (interval, daysDiff) => {
46
+ switch (interval) {
47
+ case 'daily': return Math.ceil(daysDiff);
48
+ case 'weekly': return Math.ceil(daysDiff / 7);
49
+ case 'monthly': return Math.ceil(daysDiff / 30);
50
+ default: return daysDiff;
51
+ }
52
+ };
53
+ const estimatedDays = parseDateMathDays(startDate);
54
+ const estimatedBuckets = calculateBuckets(validatedArgs.interval, estimatedDays);
55
+ this.logger.info('Getting visit trends', {
56
+ interval: validatedArgs.interval,
57
+ startDate,
58
+ endDate,
59
+ groupBy,
60
+ estimatedBuckets,
61
+ account: validatedArgs.account,
62
+ group: validatedArgs.group,
63
+ subscription: validatedArgs.subscription,
64
+ });
65
+ const client = this.elasticsearch.getClient();
66
+ const index = field_constants_js_1.FIELD_CONSTANTS.index;
67
+ const timeField = field_constants_js_1.FIELD_CONSTANTS.timeField;
68
+ const testVisitField = field_constants_js_1.FIELD_CONSTANTS.testVisitField;
69
+ const accountField = field_constants_js_1.FIELD_CONSTANTS.accountField;
70
+ const groupField = field_constants_js_1.FIELD_CONSTANTS.groupField;
71
+ const subscriptionField = field_constants_js_1.FIELD_CONSTANTS.subscriptionField;
72
+ const providerField = field_constants_js_1.FIELD_CONSTANTS.providerField;
73
+ const patientField = field_constants_js_1.FIELD_CONSTANTS.patientField;
74
+ const callDurationField = field_constants_js_1.FIELD_CONSTANTS.callDurationField;
75
+ const meetingBasedField = field_constants_js_1.FIELD_CONSTANTS.meetingBasedField;
76
+ // Build filters
77
+ const filters = [
78
+ {
79
+ range: {
80
+ [timeField]: {
81
+ gte: startDate,
82
+ lt: endDate,
83
+ },
84
+ },
85
+ },
86
+ {
87
+ term: {
88
+ [testVisitField]: 'No',
89
+ },
90
+ },
91
+ {
92
+ bool: {
93
+ should: [
94
+ { exists: { field: callDurationField } },
95
+ { term: { [meetingBasedField]: false } },
96
+ ],
97
+ minimum_should_match: 1,
98
+ },
99
+ },
100
+ ];
101
+ if (validatedArgs.account) {
102
+ filters.push({
103
+ term: {
104
+ [accountField]: validatedArgs.account,
105
+ },
106
+ });
107
+ }
108
+ if (validatedArgs.group) {
109
+ filters.push({
110
+ term: {
111
+ [groupField]: validatedArgs.group,
112
+ },
113
+ });
114
+ }
115
+ if (validatedArgs.subscription) {
116
+ filters.push({
117
+ term: {
118
+ [subscriptionField]: validatedArgs.subscription,
119
+ },
120
+ });
121
+ }
122
+ let calendarInterval;
123
+ switch (validatedArgs.interval) {
124
+ case 'daily':
125
+ calendarInterval = 'day';
126
+ break;
127
+ case 'weekly':
128
+ calendarInterval = 'week';
129
+ break;
130
+ case 'monthly':
131
+ calendarInterval = 'month';
132
+ break;
133
+ default:
134
+ calendarInterval = 'day';
135
+ }
136
+ const aggs = {
137
+ trends_over_time: {
138
+ date_histogram: {
139
+ field: timeField,
140
+ calendar_interval: calendarInterval,
141
+ min_doc_count: 0,
142
+ },
143
+ aggs: {
144
+ unique_accounts: {
145
+ cardinality: { field: accountField },
146
+ },
147
+ unique_providers: {
148
+ cardinality: { field: providerField },
149
+ },
150
+ unique_patients: {
151
+ cardinality: { field: patientField },
152
+ },
153
+ },
154
+ },
155
+ };
156
+ if (groupBy !== 'none') {
157
+ let groupFieldName;
158
+ switch (groupBy) {
159
+ case 'subscription':
160
+ groupFieldName = subscriptionField;
161
+ break;
162
+ case 'account':
163
+ groupFieldName = accountField;
164
+ break;
165
+ case 'group':
166
+ groupFieldName = groupField;
167
+ break;
168
+ default:
169
+ groupFieldName = subscriptionField;
170
+ }
171
+ aggs.by_group = {
172
+ terms: {
173
+ field: groupFieldName,
174
+ size: aggregation_limits_js_1.AGGREGATION_LIMITS.MEDIUM, // Safeguard: cap at 50 to prevent data limits
175
+ },
176
+ aggs: {
177
+ trends_over_time: {
178
+ date_histogram: {
179
+ field: timeField,
180
+ calendar_interval: calendarInterval,
181
+ min_doc_count: 0,
182
+ },
183
+ aggs: {
184
+ unique_accounts: {
185
+ cardinality: { field: accountField },
186
+ },
187
+ unique_providers: {
188
+ cardinality: { field: providerField },
189
+ },
190
+ unique_patients: {
191
+ cardinality: { field: patientField },
192
+ },
193
+ },
194
+ },
195
+ },
196
+ };
197
+ }
198
+ const query = {
199
+ index,
200
+ size: 0,
201
+ filter_path: 'aggregations',
202
+ body: {
203
+ track_total_hits: false,
204
+ query: {
205
+ bool: {
206
+ filter: filters,
207
+ },
208
+ },
209
+ aggs,
210
+ },
211
+ };
212
+ this.logger.debug('Executing query', { query: JSON.stringify(query, null, 2) });
213
+ const response = await client.search(query);
214
+ const responseAggs = response.aggregations;
215
+ let trends = [];
216
+ let totalVisits = 0;
217
+ if (groupBy === 'none') {
218
+ const buckets = responseAggs?.trends_over_time?.buckets || [];
219
+ trends = buckets.map((bucket) => {
220
+ const count = bucket.doc_count || 0;
221
+ totalVisits += count;
222
+ return {
223
+ date: bucket.key_as_string || new Date(bucket.key).toISOString(),
224
+ count,
225
+ unique_accounts: bucket.unique_accounts?.value || 0,
226
+ unique_providers: bucket.unique_providers?.value || 0,
227
+ unique_patients: bucket.unique_patients?.value || 0,
228
+ };
229
+ });
230
+ }
231
+ else {
232
+ const valueKey = `${groupBy}_value`;
233
+ const groupBuckets = responseAggs?.by_group?.buckets || [];
234
+ trends = groupBuckets.map((groupBucket) => {
235
+ const groupValue = groupBucket.key;
236
+ const trendBuckets = groupBucket.trends_over_time?.buckets || [];
237
+ const dataPoints = trendBuckets.map((bucket) => {
238
+ const count = bucket.doc_count || 0;
239
+ totalVisits += count;
240
+ return {
241
+ date: bucket.key_as_string || new Date(bucket.key).toISOString(),
242
+ count,
243
+ unique_accounts: bucket.unique_accounts?.value || 0,
244
+ unique_providers: bucket.unique_providers?.value || 0,
245
+ unique_patients: bucket.unique_patients?.value || 0,
246
+ };
247
+ });
248
+ return {
249
+ [valueKey]: groupValue,
250
+ data_points: dataPoints,
251
+ };
252
+ });
253
+ }
254
+ const averagePerPeriod = trends.length > 0
255
+ ? (groupBy === 'none'
256
+ ? Math.round((totalVisits / trends.length) * 100) / 100
257
+ : Math.round((totalVisits / trends.length) * 100) / 100)
258
+ : 0;
259
+ this.logger.info('Successfully retrieved visit trends', {
260
+ interval: validatedArgs.interval,
261
+ totalVisits,
262
+ dataPoints: trends.length,
263
+ });
264
+ return {
265
+ interval: validatedArgs.interval,
266
+ period: `${startDate} to ${endDate}`,
267
+ startDate,
268
+ endDate,
269
+ trends,
270
+ total_visits: totalVisits,
271
+ average_per_period: averagePerPeriod,
272
+ };
273
+ }
274
+ catch (error) {
275
+ if (error instanceof Error && error.name === 'ZodError') {
276
+ throw new handlers_js_1.ValidationError('Invalid arguments for get_visit_trends', {
277
+ details: error.message,
278
+ });
279
+ }
280
+ if (error instanceof handlers_js_1.ValidationError) {
281
+ throw error;
282
+ }
283
+ this.logger.error('Failed to get visit trends', {}, error);
284
+ throw new handlers_js_1.ElasticsearchError('Failed to get visit trends from Elasticsearch', error, { args });
285
+ }
286
+ }
287
+ }
288
+ exports.GetVisitTrendsTool = GetVisitTrendsTool;
289
+ //# sourceMappingURL=get-visit-trends.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-visit-trends.js","sourceRoot":"","sources":["../../src/tools/get-visit-trends.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export { GetIndexFieldsTool } from './get-index-fields.js';
2
+ export { TopChangeTool } from './top-change.js';
3
+ export { PeriodSummaryTool } from './get-subscription-breakdown.js';
4
+ export { GetPlatformBreakdownTool } from './get-platform-breakdown.js';
5
+ export { GetRatingDistributionTool } from './get-rating-distribution.js';
6
+ export { GetVisitTrendsTool } from './get-visit-trends.js';
7
+ export { GetUsageProfileTool } from './get-usage-profile.js';
8
+ export { FindEntitiesByMetricTool } from './find-entities-by-metric.js';
9
+ export { GetUsageLeaderboardTool } from './get-usage-leaderboard.js';
10
+ export type { GetIndexFieldsArgs, GetIndexFieldsResult, FieldInfo, } from './get-index-fields.js';
11
+ export type { TopChangeArgs, TopChangeResult, ChangeInfo, } from './top-change.js';
12
+ export type { PeriodSummaryArgs, PeriodSummaryResult, SubscriptionMetrics, } from './get-subscription-breakdown.js';
13
+ export type { GetPlatformBreakdownArgs, PlatformBreakdownResult, PlatformMetrics, } from './get-platform-breakdown.js';
14
+ export type { GetRatingDistributionArgs, RatingDistributionResult, RatingBucket, } from './get-rating-distribution.js';
15
+ export type { GetVisitTrendsArgs, VisitTrendsResult, TrendDataPoint, GroupedTrendData, } from './get-visit-trends.js';
16
+ export type { GetUsageProfileArgs, UsageProfileResult, UsageProfileItem, } from './get-usage-profile.js';
17
+ export type { FindEntitiesByMetricArgs, FindEntitiesByMetricResult, EntityMetricResult, } from './find-entities-by-metric.js';
18
+ export type { GetUsageLeaderboardArgs, GetUsageLeaderboardResult, EntityUsageMetrics, } from './get-usage-leaderboard.js';
19
+ //# sourceMappingURL=index.d.ts.map